package controladores;

import java.awt.Image;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.JOptionPane;

import datas.DataNick;
import logica.Cliente;
import logica.Compra;
import logica.Desarrollador;
import logica.Perfil;
import persistencia.PersistirCompra;
import persistencia.PersistirPerfil;

public class ControladorPerfil {

	public ControladorPerfil() {}
	
	
/**********************************************************************************************************/
/**********************************************************************************************************/
	/*------------------------ ALTA DE PERFIL  -------------------*/
	
	//DEVULVE TRUE SII AGREGA A LA BD EN CLIENTE CLI
	public boolean agregarCliente(Cliente cli){
		try {
			new PersistirPerfil().addCliente(cli);
			return true;
		}
		catch (Exception e) {
			return false;
		}
	}
	
	
	//DEVULVE TRUE SII AGREGA A LA BD EN DESARROLLADOR DES
	public boolean agregarDesarrollador(Desarrollador des){
		try {
			new PersistirPerfil().addDesarrollador(des);
			return true;
		}
		catch (Exception e) {
			return false;
		}
	}
	
		
	
	
/**********************************************************************************************************/
/**********************************************************************************************************/
	/*------------------------ COMPRAR JUEGO  -------------------*/
	
	//DEVULEVE TRUE SII EXISTE UN CLIENTE CON ESE NICK
	public boolean existeNickCliente(String nick){
		boolean existe = false;
		PersistirPerfil pp = new PersistirPerfil();
		ResultSet rs = pp.getNickCliente();
		try {
			while(rs.next() && !existe){
				existe = rs.getString("Nick").equals(nick);
			}
			rs.close();
		} 
		catch (SQLException e) {
			e.printStackTrace();
		}
		return existe;
	}
	
	
	//DEVULVE TRUE SII EL CLIENTE DE NICK COMO EL JUEGO DE NOMBRE
	public boolean comproJuego(String nick, String nombre){
		System.out.println("--------------------------------------------");
		System.out.println("NICK:"+nick+".");
		System.out.println("JUEGO:"+nombre+".");
		boolean compro = false;
		try {
			PersistirPerfil pp = new PersistirPerfil();
			ResultSet rs = pp.getJuegosDe(nick);
			while(rs.next() && !compro){
				compro = nombre.equals(rs.getString("Nombre"));
			}
			rs.close();
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN comproJuego");
		}
		return compro;
	}
	
	
	//PERSISTIR LA COMPRA DEL JUEGO EN LA BASE DE DATOS.
	public void comprarJuego(String nick, String nombre, int dia, int mes, int anio){
		@SuppressWarnings("deprecation")
		Date fecha = new Date(anio-1900, mes-1, dia);
		Compra nueva = new Compra(nick.toUpperCase(), nombre.toUpperCase(), fecha);
		PersistirCompra pc = new PersistirCompra();
		pc.guardarCompra(nueva);
	}
	
/**********************************************************************************************************/
/**********************************************************************************************************/
	/*--------------------CONSULTAR PERFIL -------------- TODOS OK  ----------------------*/
	
	//DEVULVE UN SET DE DATANICK CON LOS NICKS DE TODOS LOS CLIENTES
	public Set<DataNick> listarClientes(){
		Set<DataNick> perfiles = new LinkedHashSet<DataNick>();
		try {
			PersistirPerfil pp = new PersistirPerfil();
			ResultSet rs = pp.getNickCliente();
			while(rs.next()){
				DataNick nuevo = new DataNick(rs.getString("Nick"));
				perfiles.add(nuevo);
			}
			rs.close();
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN listarClientes");
		}
		return perfiles;
	}
	
	
	//DEVULVE UN SET DE DATANICK CON LOS NICKS DE TODOS LOS DESARROLLADORES
	public Set<DataNick> listarDesarrolladores(){
		Set<DataNick> perfiles = new LinkedHashSet<DataNick>();		
		try {
			PersistirPerfil pp = new PersistirPerfil();
			ResultSet rs = pp.getNickDesarrollador();
			while(rs.next()){
				DataNick nuevo = new DataNick(rs.getString("Nick"));
				perfiles.add(nuevo);
			}
			rs.close();
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN listarDesarrolladores");
		}
		return perfiles;
	}
	
	
	//DEVULVE EL PERFIL DE UN USUARIO, SI tipo < 1 = CLIENTE, SI tipo > 0 = DESARROLLADOR, NULL EN OTRO CASO
	public Perfil obtenerDatos(String nick, int tipo){
		Perfil perfil = null;
		try{
			PersistirPerfil pp = new PersistirPerfil();
			//INFORMACION DEL "CLIENTE"
			if(tipo < 0){
				ResultSet rs = pp.getDataInfoCliente(nick);
				if(rs != null){
					String nombre = rs.getString("Nombre");
					String apellido = rs.getString("Apellido");
					String email = rs.getString("Email");
					Date fecha = rs.getDate("Nacimiento");
					int edad = rs.getInt("Edad");
					byte[] b = rs.getBytes("Imagen");
					Image foto = null;
					if(b != null){
						foto = convertirImagen(b);
					}
					perfil = new Cliente(nick, nombre, apellido, email, fecha, edad, foto);
					rs.close();
				}
			}
			else
			//INFORMACION DEL DESARROLLADOR
			if(tipo > 0){
				ResultSet rs = pp.getDataInfoDesarrollador(nick);
				if(rs != null){
					String nombre = rs.getString("Nombre");
					String apellido = rs.getString("Apellido");
					String email = rs.getString("Email");
					Date fecha = rs.getDate("Nacimiento");
					int edad = rs.getInt("Edad");
					byte[] b = rs.getBytes("Imagen");
					Image foto = null;
					if(b != null){
						foto = convertirImagen(b);
					}
					String link = rs.getString("Link");
					perfil = new Desarrollador(nick, nombre, apellido, email, fecha, edad, foto, link);
					rs.close();
				}
			}
		}
		catch(Exception e){
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN obtenerDatos");
		}
		return perfil;
	}

	
/***************************************************************************************************************/
/***************************************************************************************************************/
	/*------------- MODIFICAR PERFIL ----------------- NACHEEN --------------*/
	
	//DEVUELVE TRUE SI EXISTE UN DESARROLLADOR CON ESE NICK, FALSE EN OTRO CASO
	public boolean esDesarrollador(String nick){
		boolean es = false;
		try {
			PersistirPerfil pp = new PersistirPerfil();
			ResultSet rs = pp.getNickDesarrollador();
			while(rs.next() && !es){
				es = rs.getString("Nick").equals(nick);
			}
			rs.close();
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN esDesarrollador");
		}
		return es;
	}
	

	//DEVULVE TRUE SII EXISTE UN NICK, FALSE EN OTRO CASO
	public boolean existeNick(String nick){
		boolean existe = false;
		try {
			PersistirPerfil pp = new PersistirPerfil();
			ResultSet rs = pp.getNickCliente();
			while(rs.next() && !existe){
				existe = rs.getString("Nick").equals(nick);
			}
			rs.close();
			if(!existe){
				rs = pp.getNickDesarrollador();
				while(rs.next() && !existe){
					existe = rs.getString("Nick").equals(nick);
				}
				rs.close();
			}
		} 
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN existeNick");
		}
		return existe;
	}
	
	
	//DEVULVE TRUE SII EXISTE UN EMAIL, FALSE EN OTRO CASO
	public boolean existeEmail(String email){
		boolean existe = false;	
		try {
			PersistirPerfil pp = new PersistirPerfil();
			ResultSet rs = pp.getEmailClientes();
			while(rs.next() && !existe){
				existe = rs.getString("Email").equals(email);
			}
			rs.close();
			if(!existe){
				rs = pp.getEmailDesarrolladores();
				while(rs.next() && !existe){
					existe = rs.getString("Email").equals(email);							
				}
				rs.close();
			}
		} 
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN existeNick");
		}
		return existe;
	}
	
	
	//MODIFICAEL PERFIL DE NICK CON LOS DATOS DE PERFIL
	public boolean cambiarDatos(Perfil perfil, String nick, boolean esDes){
		try {
			if(esDes){
				Desarrollador des = (Desarrollador)perfil;
				new PersistirPerfil().updateDesarrollador(des, nick);
			}
			else{
				Cliente cli = (Cliente)perfil;
				new PersistirPerfil().updateCliente(cli, nick);
			}
			return true;
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN cambiarDatos");
			return false;
		}
	}
	
/**************************************************************************************************************/
/**********************************************************************************************************/
	
	//CONVIRTE BYTES EN UNA IMAGE
	private Image convertirImagen(byte[] bytes) throws IOException{
		ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
		Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("jpeg");
		ImageReader reader = (ImageReader) readers.next();
		Object source = bis;
		ImageInputStream iis = ImageIO.createImageInputStream(source);
		reader.setInput(iis, true);
		ImageReadParam param = reader.getDefaultReadParam();
		return reader.read(0, param);
	}
	
}
